<?php

namespace App\Services\Product;

use App;
use App\Models\Test;
use Carbon\Carbon;
use Mail;
use Excel;
use Exception;
use Storage;

class ExcelService{

    /**
     * 上传文件
     * @param  UploadedFile  $file [上传的文件对象]
     * @return
     */
    public function upload($file){
        $file->move(storage_path().'/app/uploads');
    }

    /**
     * 增加数据到数据库
     * @param [string] $model       [模型名称]
     * @param [array]  $row         [单元格集合]
     */
    public function importDataToDatabase($sheetName, $row){

            $model = $this->getModelBySheetName($sheetName);
            if(is_null($model)){
                return ;
            }

            $params = $this->setModelParams($model, $row);
            if(count($params)){
                $model::create($params);
            }
    }

    /**
     * 根据工作表名取得模型名
     * @param  [string] $sheetName [工作表名]
     * @return
     */
    public function getModelBySheetName($sheetName){
        $sheetNameArray = [
            '订单报表' => 'OrderStatement',
            '宝贝报表' => 'CommodityStatement',
            '退款售后管理' => 'RefundAfterSaleManagement',
            '生e经店铺数据' => 'ShopData',
            '生e经宝贝数据' => 'CommodityData',
            '生e经订单数据' => 'OrderData',
            '生e经旺旺客服' => 'WangwangCustomerService',
            '生e经宝贝搜索词' => 'CommoditySearchWord',
            'B2C列表' => 'B2cList'
        ];
        if(array_key_exists( $sheetName, $sheetNameArray)){

            return 'App\Models\\'.$sheetNameArray[$sheetName];
        }
    }

    /**
     * 设置模型字段参数
     * @param  [string] $model         [模型名称]
     * @param  [collection] $row       [单元格集合]
     * @return
     */
    public function setModelParams($model, $row){

        $columns = (new $model)->getFillable();

        $params = [];
        foreach($columns as $key => $column){
            if(!is_null($row[$key])){

                $params = array_merge($params, [
                        $column => $row[$key]
                    ]);
            }
        }
        return $params;
    }

    /**
     * 当传入的值不为 string 类型时，进行日期格式化。针对表中的日期值被转换成 float 的情况。
     * @param [mix] $value
     * @param string $dateFormat
     */
    public function setColumnValueToDateString($value, $dateFormat = 'Y-m-d h:i'){
        if(!is_string($value)){
            $date_aux = Carbon::create(1900, 01, 01, 0);
            return $date_aux->addMinutes(($value - 2) * 24 * 60)->format($dateFormat);
        }
        return $value;
    }









    /**
     * 在 postman 测试方法
     * 使用 chunk 这个方法会出现的问题
     * 1、可能由于文件相关的参数，无法正常执行
     * 2、日期格式设置失效
     * 3、无法对多工作表导出全部数据
     *
     * 解决问题方式
     * 问题1、读取的文件名不包含中文。
     * 问题2、日期目前只能自行取出对应的值之后再调整时间，进行日期格式化。
     * 问题3、要导出全部数据，需要对单个工作表进行操作、在excel.php 文件中 force_sheets_collection 设置为 false
     */
    public function readExcelFileByChunk(){
        $files = Storage::files('uploads');

        foreach($files as $file){

            //获取单个文件全部工作表名
            $workSheetNames = Excel::load('storage/app/'.$file)->excel->getSheetNames();

            //循环取单个工作表数据
            foreach($workSheetNames as $workSheetName){

                //分块获取数据，每块300条数据
                Excel::filter('chunk')->selectSheets($workSheetName)->load('storage/app/'.$file)->chunk(300, function($results) use ($workSheetName) {

                    foreach($results as $row){
                        $excelService = $this->importDataToDatabase($workSheetName, $row);
                    }

                });
            }
            //清空所选工作表
            App::make('excel.reader')->setSelectedSheets([]);
        }
    }

}